package com.yundasys.lab16springbootplus.lab16springbootplus.beandefinitionregistrar;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

/**
 * @PACKAGE_NAME: com.yundasys.lab16springbootplus.lab16springbootplus.beandefinitionregistrar
 * @NAME: MyImportDBR
 * @USER: jiangta
 * @DATE: 2022/9/22
 * @TIME: 3:21 下午
 * @PROJECT_NAME: springboot-labs
 */
public class MyImportDBR implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //得到BD，扫描接口，这里笔者写死了，但是其实可以做一个包扫描，把某一个包下的所有类都扫描进来，就像Mybatis的@MapperScan注解一样
        BeanDefinitionBuilder builder= BeanDefinitionBuilder.genericBeanDefinition(ImportTestDao.class);
        //拿到一个BeanDefinition, 这里使用一个其中一个子类来接收，代表这里构建的就是一个普通的BeanDefinition
        GenericBeanDefinition beanDefinition= (GenericBeanDefinition) builder.getBeanDefinition();
        //这里打印是因为笔者当时不确定类名要不要包含包名
        System.out.println(beanDefinition.getBeanClassName());
        //给我们的beanDefinition添加一个构造方法，并且传入我们需要的bean名字
        beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(beanDefinition.getBeanClassName());
        //把代理对象给赋予给BeanDefinition
        beanDefinition.setBeanClass(MyfactoryBean.class);
        //这里的名字可以随便取，这里是随着Spring名规范取的。话说这个接口的另一个方法有BeanNameGenerator这个参数就是让大家自由发挥的
        registry.registerBeanDefinition("importTestDao",beanDefinition);

    }
}
